package com.app.gamev2.objects

import android.content.Context
import android.graphics.PointF
import android.view.animation.AnimationUtils
import android.widget.ImageView
import com.app.gamev2.R
import com.app.gamev2.game.GameConfig

/**
 * 气球对象类，定义气球的属性和方法
 */
class Player(
    context: Context,
    private val imageView: ImageView
) {
    // 位置坐标
    var position = PointF()
    // 当前氦气罐等级
    var bucketLevel = 1
        private set
    
    /**
     * 设置氦气罐等级
     */
    fun setBucketLevel(level: Int) {
        bucketLevel = level
        updatePlayerImage()
    }
    /**
     * 获取玩家的ImageView
     */
    fun getImageView(): ImageView {
        return imageView
    }
    
    // 跳跃状态
    var isJumping = false
    // 漂浮状态标志（吃到氦气罐后站在平台上时为true，不受重力影响）
    var isFloating = false
    // 跳跃计数（用于连跳功能）
    private var jumpCount = 0
    
    /**
     * 设置跳跃计数
     */
    fun setJumpCount(count: Int) {
        jumpCount = count
    }
    // 跳跃力
    var jumpPower = 0f
    // 水平速度
    var horizontalVelocity = 0f
    // 垂直速度
    var verticalVelocity = 0f
    // 气球尺寸
    var size = 0f
    // 水平位移（用于平滑移动动画）
    var targetX = 0f

    // 初始化
    init {
        // 设置初始氦气罐等级的图片
        updatePlayerImage()
    }

    /**
     * 跳跃方法
     * @param power 跳跃力度（由按住时间决定）
     * @return 是否成功跳跃
     */
    fun jump(power: Float): Boolean {
        // 实现连跳功能：允许在第一次跳跃后再次跳跃一次
        if (!isJumping || jumpCount < GameConfig.MAX_JUMP_COUNT) {
            if (!isJumping) {
                jumpCount = 0
                isJumping = true
                isFloating = false // 跳跃时恢复重力影响
            }
            jumpCount++
            
            // 根据跳跃次数调整跳跃力度
            val jumpForce = if (jumpCount > 1) {
                // 第二次跳跃使用衰减后的力度
                -power * GameConfig.JUMP_FORCE_MULTIPLIER * GameConfig.SECOND_JUMP_FORCE_REDUCTION
            } else {
                // 第一次跳跃使用完整力度
                -power * GameConfig.JUMP_FORCE_MULTIPLIER
            }
            
            verticalVelocity = jumpForce
            jumpPower = power
            
            // 启动跳跃动画
            val jumpAnim = AnimationUtils.loadAnimation(imageView.context, R.anim.player_jump)
            imageView.startAnimation(jumpAnim)
            
            return true
        }
        return false
    }

    /**
     * 移动方法
     * @param deltaX 水平移动距离
     */
    fun move(deltaX: Float) {
        // 限制每次操作的最大移动距离，使移动更加稳定和可预测
        val maxMovePerTap = 30f // 每次点击的最大移动距离
        val limitedDeltaX = deltaX.coerceIn(-maxMovePerTap, maxMovePerTap)
        targetX += limitedDeltaX
    }

    /**
     * 合并氦气罐方法
     * @return 是否成功合并（等级是否提升）
     */
    fun mergeBucket(): Boolean {
        // 氦气罐等级提升
        if (bucketLevel < GameConfig.WIN_BUCKET_LEVEL) {
            bucketLevel++
            updatePlayerImage()
            
            // 启动氦气罐合并动画
            val mergeAnim = AnimationUtils.loadAnimation(imageView.context, R.anim.bucket_merge)
            imageView.startAnimation(mergeAnim)
            
            return true
        }
        return false
    }

    /**
     * 更新气球图片和大小（根据氦气罐等级）
     */
    private fun updatePlayerImage() {
        // 根据等级选择简笔画风格的气球图片 - 为每个等级使用独立的资源引用
        val resId = when (bucketLevel) {
            1 -> R.drawable.balloon_simple_lv1
            2 -> R.drawable.balloon_simple_lv2
            3 -> R.drawable.balloon_simple_lv3
            4 -> R.drawable.balloon_simple_lv3 // 临时使用lv3，后续应创建独立资源
            5 -> R.drawable.balloon_simple_lv3 // 临时使用lv3，后续应创建独立资源
            6 -> R.drawable.balloon_simple_lv3 // 临时使用lv3，后续应创建独立资源
            7 -> R.drawable.balloon_simple_lv3 // 临时使用lv3，后续应创建独立资源
            8 -> R.drawable.balloon_simple_lv3 // 临时使用lv3，后续应创建独立资源
            9 -> R.drawable.balloon_simple_lv3 // 临时使用lv3，后续应创建独立资源
            10 -> R.drawable.balloon_simple_lv3 // 临时使用lv3，后续应创建独立资源
            else -> R.drawable.balloon_simple_lv3
        }
        imageView.setImageResource(resId)
        
        // 根据等级调整气球大小 - 使用更小的基础尺寸
        // 基础大小设为40dp，比原来的60dp小
        val baseSize = imageView.context.resources.displayMetrics.density * 40f
        val scaleFactor = when (bucketLevel) {
            1 -> 0.8f // 基础大小
            2 -> 0.9f // 增加12.5%
            3 -> 1.0f // 增加25%
            4, 5 -> 1.1f // 增加37.5%
            6, 7, 8 -> 1.2f // 增加50%
            9, 10 -> 1.3f // 最大尺寸，增加62.5%
            else -> 1.3f
        }
        
        // 设置气球尺寸
        size = baseSize * scaleFactor
        
        // 更新ImageView的布局参数
        val layoutParams = imageView.layoutParams
        layoutParams.width = size.toInt()
        layoutParams.height = (size * 1.33f).toInt() // 保持宽高比
        imageView.layoutParams = layoutParams
    }

    /**
     * 落地方法
     */
    fun land() {
        isJumping = false
        isFloating = true // 设置为漂浮状态，不受重力影响
        jumpCount = 0
        verticalVelocity = 0f
        
        // 着陆时校准位置，确保与平台无间隙
        // 游戏管理器会通过checkIfPlayerStillOnPlatform方法进一步校准位置
        
        // 启动落地动画
        val landAnim = AnimationUtils.loadAnimation(imageView.context, R.anim.player_land)
        imageView.startAnimation(landAnim)
    }

    /**
     * 更新物理状态
     * @param deltaTime 时间间隔
     */
    fun updatePhysics(deltaTime: Float) {
        // 只有非漂浮状态才受重力影响并更新垂直位置
        if (!isFloating) {
            verticalVelocity += GameConfig.GRAVITY * deltaTime
            // 更新垂直位置
            position.y += verticalVelocity * deltaTime
        }
        
        // 平滑移动 - 使角色位置逐渐接近目标位置
        val moveSpeed = 25f // 增加移动速度，使响应更及时
        val distanceToTarget = targetX - position.x
        
        // 使用更一致的移动算法
        if (Math.abs(distanceToTarget) > 0.1f) { // 进一步减小阈值
            // 计算移动量，使用更直接的方法
            val normalizedDistance = distanceToTarget / Math.abs(distanceToTarget) // 获取方向
            val moveAmount = Math.min(Math.abs(distanceToTarget), 20f * deltaTime * moveSpeed)
            position.x += normalizedDistance * moveAmount
        } else {
            position.x = targetX // 直接设置到位
        }
        
        // 确保位置不会无限接近，提高稳定性
        if (Math.abs(distanceToTarget) < 0.1f) {
            targetX = position.x
        }
    }


}